#include <linux/module.h>
#include <linux/in.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>


//动态初始化
struct tasklet_struct mytasklet;


void mytasklet_func(unsigned long data) {
    printk("data is %ld\n", data);
}

//静态初始化
//DECLARE_TASKLET(mytasklet, mytasklet_func, 8);



irqreturn_t test_interrupt(int irq, void* str) {
    printk("test_interrupt\n");
   
    //激活tasklet
    tasklet_schedule(&mytasklet);
    //tasklet_disable(&mytasklet);
    //tasklet_enable(&mytasklet);
    //tasklet_kill(&mytasklet);
    //tasklet_init(&mytasklet, mytasklet_func, 8);
    //tasklet_hi_schedule(&mytasklet);
     return IRQ_RETVAL(IRQ_HANDLED); // 中断已经发生
}



static int __init apply_irq_init(void)
{
    
    int ret = 0;
    int irq = 0;
    //返回引脚对应中断号
    irq = gpio_to_irq(8);
    printk("irq = %d\n", irq);
    //申请中断
    ret = request_irq(irq, test_interrupt, IRQF_TRIGGER_RISING, "test", NULL);
    if (ret < 0) {
        printk("request_irq failed \n");
        return -1;
    }
    //动态初始化
    tasklet_init(&mytasklet, mytasklet_func, 8);
    //静态初始化
    //DECLARE_TASKLET(mytasklet, mytasklet_func, 8);
    
    return 0;
}

static void __exit apply_irq_exit(void)
{
    printk("apply_irq\n");
    free_irq(8, NULL);
    tasklet_enable(&mytasklet);
    tasklet_kill(&mytasklet);
}






module_init(apply_irq_init);
module_exit(apply_irq_exit);
MODULE_LICENSE("GPL");